package com.ftg.learn.chapter17.table;

import java.util.*;
import java.util.stream.Stream;

/**
 * @author KangJx
 * @date 2021/8/11
 */
public class LearnHomework {

    //1、把自己的个人信息存储到map里面
    //2、再把三个人的信息存起来:
    //3、把班级j2107 和学生信息绑定到一起
    //这是2008-10 前后  清华同方电话面试的原题 :
    //4、对1里面的信息进行遍历
    //4.1  使用values
    //4.2  使用 keyset
    //4.3  使用entryset

    public Map<String,Object> q1(String username,int userage,char usersex){
        Map<String,Object> map = new HashMap<>();
        map.put("姓名",username);
        map.put("年龄",userage);
        map.put("性别",usersex);
        return map;
    }

    /**
     * 参数太多了...参数大多是重复的
     * @param username
     * @param userage
     * @param usersex
     * @param username1
     * @param userage1
     * @param usersex1
     * @param username2
     * @param userage2
     * @param usersex2
     * @return
     */
    public List<Map<String,Object>> q2(String username, int userage, char usersex
        ,String username1, int userage1, char usersex1
        ,String username2, int userage2, char usersex2){
        //部分公司里希望再使用list里如果有明确的长度，声明Arraylist（长度）
        List<Map<String,Object>> list = new ArrayList<>(3);
        list.add(q1(username,userage,usersex));
        list.add(q1(username1,userage1,usersex1));
        list.add(q1(username2,userage2,usersex2));
        return list;
    }

    /**
     * 这是一个方法完成相第2题 s
     * @param userinfo  多个人信息
     *                  哥们 你写的这个方法有问题，我们要用的时候，我知道你的map里面的key是什么吗！？
     *                  usernfo.put("a","张三");
     *                  get() 只能一个办法 我要知道 key
     *                  k（x）-v(y)
     *
     * @return
     */
    public List<Map<String,Object>> q22(Map<String,Object>... userinfo){
        //部分公司里希望再使用list里如果有明确的长度，声明Arraylist（长度）
        List<Map<String,Object>> list = new ArrayList<>(3);
        for (Map<String,Object> user : userinfo){
            list.add(user);
        }
        return list;
    }

    /**
     * 面向对象的设计
     * @param stu
     * @return
     */
    public List<Student> q23(Student... stu){
        //部分公司里希望再使用list里如果有明确的长度，声明Arraylist（长度）
        List<Student> list = new ArrayList<>(3);
        for (Student s : stu){
            list.add(s);
        }

        list.forEach( st ->{
            System.out.println(st.getStuage());
            System.out.println(st.getStuname());
        });
        return list;
    }

    public List<Clazz> q3(Clazz...cz){
        //部分公司里希望再使用list里如果有明确的长度，声明Arraylist（长度）
        List<Clazz> list = new ArrayList<>(3);
        for (Clazz s : cz){
            list.add(s);
        }
        return list;
    }

    public void q4(Map<String,Object> map){
        System.out.println("第一种方法遍历 == values");
        //它是一个map原带集合里面用来存储 ： -- value信息s
        Collection<Object> collection = map.values();
        //迭代器 | foreach
        for(Iterator it = collection.iterator();it.hasNext();){
            System.out.println(it.next());
        }

        for(Object obj:collection){
            System.out.println(obj);
        }

        System.out.println("我们考虑使用key : 无序不能按照下标来取，有可能没有下标");
        //--或者下标没有对开发人员开放
        Set<String> sets = map.keySet();
        for(String key : sets){
            System.out.println("key=" + key);
            System.out.println("value= " + map.get(key));
        }

        System.out.println("我们考虑使用  entryset");
        Set<Map.Entry<String, Object>> es = map.entrySet();
        for(Map.Entry<String, Object> e : es){
            System.out.println("key = " + e.getKey());
            System.out.println("values = " + e.getValue());
        }

        //哪天好好玩玩这个玩意！
        //1、interface - default
        //2、lambda 表达式
        //2.1 四大基本操作
        //3、stream | foreach
        System.out.println("尝试一下别的方案");

        map.forEach((k,v)->{
            System.out.println(k);
            System.out.println(v);
        });

        List<Integer> list = new ArrayList<>(3);
        list.forEach( yj -> {
            System.out.println(yj);
        } );

        Set<String> set = new HashSet<>();
        set.forEach(s->{
            System.out.println(s);
        });

    }

    /**
     * 为什么hashmap里面的key是不重复的?
     *  1、hashmap数组存储
     *  2、每创建一个元素都要计算，这个元素存储到数组的哪一个下标里面
     *  3、hashmap底层计算  下标  hash(key) ^ 0 >>>16;
     *  4、如果key相同那么计算出来以后的下标也是相同的，所以数组会把相同的元素覆盖
     *
     *  -- 你可以把map的key看成是数组的下标
     *
     * @param args
     */
    public static void main(String[] args) {
        int a = 1 + 2;
        a *= 3;
        a -= 4;
        System.out.println(a);
    }

}
